package com.zy.函数式编程.函数定义

object Test {

  def main(args: Array[String]): Unit = {

    // 可以在函数内部定义函数，也可以在类中定义函数
    def sum(x: Int, y: Int): Int = {
      x + y
    }

    println(sum(6, 7))

    println("==============================")

    // 可变长参数
    def testFun(objs: String*): Unit = {
      println(objs)
    }

    testFun("1", "2", "3", "4")

    println("==============================")


    // 参数默认值
    def testFun2(name: String = "朋友"): Unit = println(s"你好${name}")

    testFun2()
    testFun2("张三")

    println("==============================")

    // 带名参数 主要用于配合参数默认值使用(大量参数拥有默认值，只针对非默认值进行配置)
    def testFun3(name: String, age: Int): Unit = println(s"你好，${age}岁的${name}")

    testFun3(age = 13, name = "张三")


    println("==============================")

    // 函数至简原则
    def fun(name: String): String = {
      return name
    }

    // 1. return可以省略，函数最后一行代码作为返回值
    def fun1(name: String): String = {
      name
    }

    // 2. 如果函数只有一行代码，则可以省略花括号
    def fun2(name: String): String = name

    // 3. 返回值类型可以省略(编译器可以推断出来)(如果包含return，则不可以省略)
    def fun3(name: String) = name

    // 4. 如果期望的是无返回值类型，则可以省略 = 不可以省略{}
    def fun4(name: String) {
      println(s"Hello ${name}")
    }

    // 5. 函数无参，调用小括号时可以省略括号
    // 6. 如果不关心函数名，只关心业务逻辑，则可以省略函数名(匿名函数)
    (name: String) => println(s"Hello ${name}")

  }

}
